package net.servir.capacidades.dao.jdbc;

import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import net.servir.capacidades.dao.AlgoritmoDAO;
import net.servir.capacidades.model.DemoParticipante;
import net.servir.capacidades.model.ExmCalifica;
import net.servir.capacidades.model.ExmConfig;
import net.servir.capacidades.model.ExmPerfil;
import net.servir.capacidades.model.FuncionLeyenda;
import net.servir.capacidades.model.GrupoCalificacion;
import net.servir.capacidades.model.PreguntaReporte;
import net.servir.capacidades.model.PreguntaServicio;
import net.servir.capacidades.model.PreguntaTipo;
import net.servir.capacidades.model.SectorPregunta;
import net.servir.capacidades.model.jsp.JspPerfilExamenEdicion;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
import org.springframework.stereotype.Repository;

@Repository
public class JdbcAlgoritmoDAO implements AlgoritmoDAO {

	private SimpleJdbcTemplate jdbcTemplate;
	private DataSource dataSource;
	
	@Autowired
	private JdbcCapacidadesDAO jdbcCapacidadesDao;
	
	@Autowired
	public JdbcAlgoritmoDAO(DataSource dataSource){
		this.jdbcTemplate = new SimpleJdbcTemplate(dataSource);
		this.dataSource = dataSource;
	}

	public List<ExmPerfil> getPerfilesExamen(Number idSistema) {

		List<ExmPerfil> list = new LinkedList<ExmPerfil>();

		StringBuilder sql = new StringBuilder();
		sql.append("SELECT ep.ID_EXM_PERFIL,ep.EXM_PERFIL,ep.NRO_PREGUNTAS,ep.MAX_NRO_FUNCIONES,ep.ESTADO,ep.COD_USUARIO_CREA,to_char(ep.FECHA_CREACION,'DD/MM/YYYY HH24:MI') as FECHA_CREACION,COD_USUARIO_MODIFICA,to_char(FECHA_MODIFICACION,'DD/MM/YYYY HH24:MI') as FECHA_MODIFICACION,ID_SISTEMA,");
		sql.append(" to_char((SELECT COUNT(*) FROM TEST WHERE ID_EXM_PERFIL = ep.ID_EXM_PERFIL AND cod_ejecutado = 1)) AS CERRADO ");
		sql.append(" FROM EXM_PERFIL ep WHERE ID_SISTEMA = ?");

		List<Map<String, Object>> collec = jdbcTemplate.queryForList(sql.toString(),idSistema);
		for(Map<String, Object> rec : collec){
			ExmPerfil obj = new ExmPerfil();
			obj.setId_exm_perfil((Number)rec.get("ID_EXM_PERFIL"));
			obj.setExm_perfil((String)rec.get("EXM_PERFIL"));
			obj.setNro_preguntas((Number)rec.get("NRO_PREGUNTAS"));
			obj.setMax_nro_funciones((Number)rec.get("MAX_NRO_FUNCIONES"));
			obj.setEstado((String)rec.get("ESTADO"));
			obj.setCod_usuario_crea((String)rec.get("COD_USUARIO_CREA"));
			obj.setFecha_creacion((String)rec.get("FECHA_CREACION"));
			obj.setCod_usuario_modifica((String)rec.get("COD_USUARIO_MODIFICA"));
			obj.setFecha_modificacion((String)rec.get("FECHA_MODIFICACION"));
			obj.setId_sistema((Number)rec.get("ID_SISTEMA"));
			obj.setCerrado((String)rec.get("CERRADO"));

			list.add(obj);
		}
		return list;

	}	
	public String validarEliminarPerfilExamen(Integer idPerfilExamen)
	{
		String mensaje = "";

		StringBuilder sql = new StringBuilder();
		sql.append("SELECT count(*) ");
		sql.append(" FROM TEST WHERE ID_EXM_PERFIL = ? AND VALIDO = 1 ");

		int nroAmbitos = jdbcTemplate.queryForInt(sql.toString(), idPerfilExamen);
		if (nroAmbitos > 0)
			mensaje = "El Perfil tiene exámenes registrados, primero debe eliminar los examenes";
		
		return mensaje;
	}
	public void eliminarPerfilExamen(Integer idPerfilExamen)
	{
		
		StringBuilder sql = new StringBuilder();
		
		//Eliminamos todos sus dependientes
		sql.append("DELETE FROM EXM_CONFIG ");
		sql.append(" WHERE ID_EXM_PERFIL = ?");			
		
		this.jdbcTemplate.update(sql.toString(),idPerfilExamen);			
		
		sql = new StringBuilder();	
		sql.append("DELETE FROM EXM_CALIFICA ");
		sql.append(" WHERE ID_EXM_PERFIL = ?");			
		
		this.jdbcTemplate.update(sql.toString(),idPerfilExamen);			

		//Eliminamos al objeto principal
		sql = new StringBuilder();
		sql.append("DELETE FROM EXM_PERFIL ");
		sql.append(" WHERE ID_EXM_PERFIL = ?");			
		
		this.jdbcTemplate.update(sql.toString(),idPerfilExamen);			
	}
	
	public ExmPerfil getExmPerfil(Number idExmPerfil) {

		ExmPerfil obj = null;

		StringBuilder sql = new StringBuilder();
		sql.append("SELECT ID_EXM_PERFIL,EXM_PERFIL,NRO_PREGUNTAS,MAX_NRO_FUNCIONES,ESTADO,COD_USUARIO_CREA,to_char(FECHA_CREACION,'DD/MM/YYYY HH24:MI') as FECHA_CREACION,COD_USUARIO_MODIFICA,to_char(FECHA_MODIFICACION,'DD/MM/YYYY HH24:MI') as FECHA_MODIFICACION,ID_SISTEMA,");
		sql.append(" to_char((SELECT COUNT(*) FROM TEST WHERE ID_EXM_PERFIL = ? AND cod_ejecutado = 1)) AS CERRADO ");
		sql.append(" FROM EXM_PERFIL WHERE ID_EXM_PERFIL = ? ");

		List<Map<String, Object>> collec = jdbcTemplate.queryForList(sql.toString(),idExmPerfil, idExmPerfil);
		for(Map<String, Object> rec : collec){
			obj = new ExmPerfil();
			obj.setId_exm_perfil((Number)rec.get("ID_EXM_PERFIL"));
			obj.setExm_perfil((String)rec.get("EXM_PERFIL"));
			obj.setNro_preguntas((Number)rec.get("NRO_PREGUNTAS"));
			obj.setMax_nro_funciones((Number)rec.get("MAX_NRO_FUNCIONES"));
			obj.setEstado((String)rec.get("ESTADO"));
			obj.setCod_usuario_crea((String)rec.get("COD_USUARIO_CREA"));
			obj.setFecha_creacion((String)rec.get("FECHA_CREACION"));
			obj.setCod_usuario_modifica((String)rec.get("COD_USUARIO_MODIFICA"));
			obj.setFecha_modificacion((String)rec.get("FECHA_MODIFICACION"));
			obj.setId_sistema((Number)rec.get("ID_SISTEMA"));
			obj.setCerrado((String)rec.get("CERRADO"));


		}
		return obj;

	}
	public List<ExmConfig> getConfigPreguntasPerfil(Number idExmPerfil,Number idNivelGobierno,Number idPuestoTipo)
	{
		List<ExmConfig> list = new LinkedList<ExmConfig>();

		StringBuilder sql = new StringBuilder();

		/*sql.append("SELECT PT.id_pregunta_tipo,PT.pregunta_tipo ,CF.ID_EXM_CONFIG,CF.ID_EXM_PERFIL,CF.ID_NIVEL_GOBIERNO,CF.ID_PUESTO_TIPO,CF.ORDEN,CF.PORCENTAJE_PREG,CF.ID_FUNCION,CF.ID_SECTOR_PREGUNTA,CF.ID_PREGUNTA_SERVICIO");
		sql.append(" FROM PREGUNTA_TIPO PT LEFT JOIN"); 
		sql.append("    (SELECT ID_EXM_CONFIG,ID_EXM_PERFIL,ID_NIVEL_GOBIERNO,ID_PUESTO_TIPO,ID_PREGUNTA_TIPO,ORDEN,PORCENTAJE_PREG,ID_FUNCION,ID_SECTOR_PREGUNTA,ID_PREGUNTA_SERVICIO ");
		sql.append("    FROM EXM_CONFIG WHERE ID_EXM_PERFIL = ? AND ID_NIVEL_GOBIERNO = ? AND ID_PUESTO_TIPO = ?) CF ON PT.ID_PREGUNTA_TIPO = CF.ID_PREGUNTA_TIPO");
		sql.append(" WHERE PT.ID_SISTEMA IN (SELECT ID_SISTEMA FROM exm_perfil WHERE id_exm_perfil = ?)");
		sql.append(" order by CF.ORDEN,PT.pregunta_tipo ");*/
		
		sql.append("SELECT CF.ID_EXM_CONFIG,CF.ID_EXM_PERFIL,CF.ID_NIVEL_GOBIERNO,CF.ID_PUESTO_TIPO,CF.ID_PREGUNTA_TIPO,CF.ORDEN,CF.PORCENTAJE_PREG,CF.ID_FUNCION,CF.ID_SECTOR_PREGUNTA,CF.ID_PREGUNTA_SERVICIO ");
		sql.append(" ,PT.PREGUNTA_TIPO,FU.NEMOTECNICO AS FUNCION,SE.SECTOR_PREGUNTA,PS.PREGUNTA_SERVICIO");
		sql.append(" FROM EXM_CONFIG CF LEFT JOIN PREGUNTA_TIPO PT ON CF.ID_PREGUNTA_TIPO = PT.ID_PREGUNTA_TIPO");
		sql.append(" LEFT JOIN (SELECT 99 as ID_FUNCION,'<Funciones Participante>' DESCRIPCION,'Función Asignada' NEMOTECNICO from dual UNION ALL ");
		sql.append(" 			SELECT 0 as ID_FUNCION,'<Todas las Funciones>' DESCRIPCION,'Todas' NEMOTECNICO from dual UNION ALL ");
		sql.append("      		SELECT ID_FUNCION,DESCRIPCION,NEMOTECNICO");
		sql.append("      		FROM FUNCION) FU ON CF.ID_FUNCION = FU.ID_FUNCION");
		sql.append(" LEFT JOIN SECTOR_PREGUNTA SE ON CF.ID_SECTOR_PREGUNTA = SE.ID_SECTOR_PREGUNTA ");
		sql.append(" LEFT JOIN PREGUNTA_SERVICIO PS ON CF.ID_PREGUNTA_SERVICIO = PS.ID_PREGUNTA_SERVICIO ");
		sql.append(" WHERE CF.ID_EXM_PERFIL = ? AND CF.ID_NIVEL_GOBIERNO = ? AND CF.ID_PUESTO_TIPO = ?");
		sql.append(" ORDER BY CF.ORDEN");
		
		

		List<Map<String, Object>> collec = jdbcTemplate.queryForList(sql.toString(),idExmPerfil,idNivelGobierno,idPuestoTipo);
		for(Map<String, Object> rec : collec){
			ExmConfig obj = new ExmConfig();
			obj.setId_exm_config((Number)rec.get("ID_EXM_CONFIG"));
			obj.setId_exm_perfil((Number)rec.get("ID_EXM_PERFIL"));
			obj.setId_nivel_gobierno((Number)rec.get("ID_NIVEL_GOBIERNO"));
			obj.setId_puesto_tipo((Number)rec.get("ID_PUESTO_TIPO"));
			obj.setId_pregunta_tipo((Number)rec.get("ID_PREGUNTA_TIPO"));
			obj.setOrden((Number)rec.get("ORDEN"));
			obj.setPorcentaje_preg((Number)rec.get("PORCENTAJE_PREG"));
			obj.setId_funcion((Number)rec.get("ID_FUNCION"));
			obj.setId_sector_pregunta((Number)rec.get("ID_SECTOR_PREGUNTA"));
			obj.setId_pregunta_servicio((Number)rec.get("ID_PREGUNTA_SERVICIO"));
			
			obj.setPregunta_tipo((String)rec.get("PREGUNTA_TIPO"));
			obj.setFuncion((String)rec.get("FUNCION"));
			obj.setSector_pregunta((String)rec.get("SECTOR_PREGUNTA"));
			obj.setPregunta_servicio((String)rec.get("PREGUNTA_SERVICIO"));

			list.add(obj);
		}
		return list;
		
	}
	public List<ExmCalifica> getConfigCalificaPerfil(Number idExmPerfil,Number idPuestoTipo)
	{
		List<ExmCalifica> list = new LinkedList<ExmCalifica>();

		StringBuilder sql = new StringBuilder();

		sql.append("SELECT EC.ID_EXM_CALIFICA,EC.ID_EXM_PERFIL,EC.ID_PUESTO_TIPO,EC.ID_PREGUNTA_TIPO,EC.ID_FUNCION,EC.ID_GRUPO_CALIFICA,EC.PORCENTAJE_APROB");
		sql.append(" ,PT.PREGUNTA_TIPO,FU.NEMOTECNICO AS FUNCION,GC.GRUPO_CALIFICACION");
		sql.append(" FROM EXM_CALIFICA EC LEFT JOIN PREGUNTA_TIPO PT ON EC.ID_PREGUNTA_TIPO = PT.ID_PREGUNTA_TIPO");
		sql.append(" LEFT JOIN (SELECT 99 as ID_FUNCION,'Función Asignada' NEMOTECNICO from dual");
		sql.append("          UNION ALL SELECT 0 as ID_FUNCION,'Todas' NEMOTECNICO from dual");
		sql.append("          UNION ALL SELECT ID_FUNCION,NEMOTECNICO	FROM FUNCION) FU ON EC.ID_FUNCION = FU.ID_FUNCION ");
		sql.append(" LEFT JOIN GRUPO_CALIFICACION GC ON EC.ID_GRUPO_CALIFICA = GC.ID_GRUPO_CALIFICA");          
		sql.append(" WHERE EC.ID_EXM_PERFIL = ? AND EC.ID_PUESTO_TIPO = ?");
		
		

		List<Map<String, Object>> collec = jdbcTemplate.queryForList(sql.toString(),idExmPerfil,idPuestoTipo);
		for(Map<String, Object> rec : collec){
			ExmCalifica obj = new ExmCalifica();
			obj.setId_exm_califica((Number)rec.get("ID_EXM_CALIFICA"));
			obj.setId_exm_perfil((Number)rec.get("ID_EXM_PERFIL"));
			obj.setId_puesto_tipo((Number)rec.get("ID_PUESTO_TIPO"));
			obj.setId_pregunta_tipo((Number)rec.get("ID_PREGUNTA_TIPO"));
			obj.setId_funcion((Number)rec.get("ID_FUNCION"));
			obj.setId_grupo_califica((Number)rec.get("ID_GRUPO_CALIFICA"));
			obj.setPorcentaje_aprob((Number)rec.get("PORCENTAJE_APROB"));
			
			obj.setPregunta_tipo((String)rec.get("PREGUNTA_TIPO"));
			obj.setFuncion((String)rec.get("FUNCION"));
			obj.setGrupo_calificacion((String)rec.get("GRUPO_CALIFICACION"));

			list.add(obj);
		}
		return list;
		
	}	
	public Number grabarExmPerfil(JspPerfilExamenEdicion obj)
	{
		StringBuilder sql = new StringBuilder();
		Number idExmPerfil = null;
		Number idExmConfig = null;
		
		ExmPerfil exmPerfil = obj.getExmPerfil();
		
		if (exmPerfil.getId_exm_perfil() == null)
		{			 
			idExmPerfil =  this.jdbcTemplate.queryForInt("Select nvl(max(id_exm_perfil),0) + 1 from exm_perfil");
			
			exmPerfil.setId_exm_perfil(idExmPerfil);

			sql = new StringBuilder();
			sql.append("INSERT INTO EXM_PERFIL(ID_EXM_PERFIL,EXM_PERFIL,NRO_PREGUNTAS,MAX_NRO_FUNCIONES,ESTADO,COD_USUARIO_CREA,FECHA_CREACION,ID_SISTEMA)");
			sql.append(" VALUES (?,?,?,?,?,?,sysdate,?)");

			this.jdbcTemplate.update(sql.toString(),exmPerfil.getId_exm_perfil(),exmPerfil.getExm_perfil(),exmPerfil.getNro_preguntas(),exmPerfil.getMax_nro_funciones()
					,exmPerfil.getEstado(),exmPerfil.getCod_usuario_crea(),exmPerfil.getId_sistema());
		}
		else
		{
			idExmPerfil = exmPerfil.getId_exm_perfil();
			
			sql = new StringBuilder();
			sql.append("UPDATE EXM_PERFIL SET EXM_PERFIL = ?,NRO_PREGUNTAS = ?,MAX_NRO_FUNCIONES = ?,ESTADO = ?,COD_USUARIO_MODIFICA = ?,FECHA_MODIFICACION = sysdate,ID_SISTEMA = ?");
			sql.append(" WHERE ID_EXM_PERFIL = ?");

			this.jdbcTemplate.update(sql.toString(),exmPerfil.getExm_perfil(),exmPerfil.getNro_preguntas(),exmPerfil.getMax_nro_funciones(),exmPerfil.getEstado(),exmPerfil.getCod_usuario_modifica(),exmPerfil.getId_sistema(),exmPerfil.getId_exm_perfil());
			
		}
		//Grabamos la configuración de las preguntas
		for (ExmConfig exmConfig : obj.getLstExmConfig()) {
			
			exmConfig.setId_exm_perfil(idExmPerfil);
			
			if (exmConfig.getId_exm_config() == null)
			{			 
				idExmConfig =  this.jdbcTemplate.queryForInt("Select nvl(max(id_exm_config),0) + 1 from exm_config");
				
				exmConfig.setId_exm_config(idExmConfig);

				sql = new StringBuilder();
				sql.append("INSERT INTO EXM_CONFIG(ID_EXM_CONFIG,ID_EXM_PERFIL,ID_NIVEL_GOBIERNO,ID_PUESTO_TIPO,ID_PREGUNTA_TIPO,ORDEN,PORCENTAJE_PREG,ID_FUNCION,ID_SECTOR_PREGUNTA,ID_PREGUNTA_SERVICIO)");
				sql.append(" VALUES (?,?,?,?,?,?,?,?,?,?)");

				this.jdbcTemplate.update(sql.toString(),exmConfig.getId_exm_config(),exmConfig.getId_exm_perfil(),exmConfig.getId_nivel_gobierno(),exmConfig.getId_puesto_tipo(),exmConfig.getId_pregunta_tipo(),exmConfig.getOrden(),exmConfig.getPorcentaje_preg(),exmConfig.getId_funcion(),exmConfig.getId_sector_pregunta(),exmConfig.getId_pregunta_servicio());
			}
			else
			{
				idExmConfig = exmConfig.getId_exm_config();
				
				sql = new StringBuilder();
				sql.append("UPDATE EXM_CONFIG SET ID_EXM_PERFIL = ?,ID_NIVEL_GOBIERNO = ?,ID_PUESTO_TIPO = ?,ID_PREGUNTA_TIPO = ?,ORDEN = ?,PORCENTAJE_PREG = ?,ID_FUNCION = ?,ID_SECTOR_PREGUNTA = ?,ID_PREGUNTA_SERVICIO = ?");
				sql.append(" WHERE ID_EXM_CONFIG = ?");

				this.jdbcTemplate.update(sql.toString(),exmConfig.getId_exm_perfil(),exmConfig.getId_nivel_gobierno(),exmConfig.getId_puesto_tipo(),exmConfig.getId_pregunta_tipo(),exmConfig.getOrden(),exmConfig.getPorcentaje_preg(),exmConfig.getId_funcion(),exmConfig.getId_sector_pregunta(),exmConfig.getId_pregunta_servicio(),exmConfig.getId_exm_config());				
			}			
		}
				
		return idExmPerfil;		
		
	}


	
	public Number grabarExmCalificacion(ExmCalifica exmCalifica)
	{
		StringBuilder sql = new StringBuilder();
		Number idExmCalifica;
		if (exmCalifica.getId_exm_califica() == null)
		{			 
			idExmCalifica =  this.jdbcTemplate.queryForInt("Select nvl(max(id_exm_califica),0) + 1 from exm_califica");			
			exmCalifica.setId_exm_califica(idExmCalifica);
			
			sql = new StringBuilder();
			sql.append("INSERT INTO EXM_CALIFICA(ID_EXM_CALIFICA,ID_EXM_PERFIL,ID_PUESTO_TIPO,ID_PREGUNTA_TIPO,ID_FUNCION,ID_GRUPO_CALIFICA,PORCENTAJE_APROB)");
			sql.append(" VALUES (?,?,?,?,?,?,?)");

			this.jdbcTemplate.update(sql.toString(),exmCalifica.getId_exm_califica(),exmCalifica.getId_exm_perfil(),exmCalifica.getId_puesto_tipo(),exmCalifica.getId_pregunta_tipo(),exmCalifica.getId_funcion(),exmCalifica.getId_grupo_califica(),exmCalifica.getPorcentaje_aprob());
		}
		else
		{
			idExmCalifica = exmCalifica.getId_exm_califica();
			
			sql = new StringBuilder();
			sql.append("UPDATE EXM_CALIFICA SET ID_EXM_PERFIL = ?,ID_PUESTO_TIPO = ?,ID_PREGUNTA_TIPO = ?,ID_FUNCION = ?,ID_GRUPO_CALIFICA = ?,PORCENTAJE_APROB = ?");
			sql.append(" WHERE ID_EXM_CALIFICA = ?");

			this.jdbcTemplate.update(sql.toString(),exmCalifica.getId_exm_perfil(),exmCalifica.getId_puesto_tipo(),exmCalifica.getId_pregunta_tipo(),exmCalifica.getId_funcion(),exmCalifica.getId_grupo_califica(),exmCalifica.getPorcentaje_aprob(),exmCalifica.getId_exm_califica());			
		}
		
		return idExmCalifica;
	}
	public void eliminarExmCalifica(Number idExmCalifica)
	{
		StringBuilder sql = new StringBuilder();
		
		//Eliminamos todos sus dependientes
		sql.append("DELETE FROM EXM_CALIFICA ");
		sql.append(" WHERE ID_EXM_CALIFICA = ?");			
		
		this.jdbcTemplate.update(sql.toString(),idExmCalifica);			
	}
	public Number grabarExmConfig(ExmConfig exmConfig)
	{
		StringBuilder sql = new StringBuilder();
		Number idExmConfig;
		if (exmConfig.getId_exm_config() == null)
		{			 
			idExmConfig =  this.jdbcTemplate.queryForInt("Select nvl(max(id_exm_config),0) + 1 from exm_config");			
			exmConfig.setId_exm_config(idExmConfig);

			sql = new StringBuilder();
			sql.append("INSERT INTO EXM_CONFIG(ID_EXM_CONFIG,ID_EXM_PERFIL,ID_NIVEL_GOBIERNO,ID_PUESTO_TIPO,ID_PREGUNTA_TIPO,ORDEN,PORCENTAJE_PREG,ID_FUNCION,ID_SECTOR_PREGUNTA,ID_PREGUNTA_SERVICIO)");
			sql.append(" VALUES (?,?,?,?,?,?,?,?,?,?)");

			this.jdbcTemplate.update(sql.toString(),exmConfig.getId_exm_config(),exmConfig.getId_exm_perfil(),exmConfig.getId_nivel_gobierno(),exmConfig.getId_puesto_tipo(),exmConfig.getId_pregunta_tipo(),exmConfig.getOrden(),exmConfig.getPorcentaje_preg(),exmConfig.getId_funcion(),exmConfig.getId_sector_pregunta(),exmConfig.getId_pregunta_servicio());
		}
		else
		{
			idExmConfig = exmConfig.getId_exm_config();
			
			sql = new StringBuilder();
			sql.append("UPDATE EXM_CONFIG SET ID_EXM_PERFIL = ?,ID_NIVEL_GOBIERNO = ?,ID_PUESTO_TIPO = ?,ID_PREGUNTA_TIPO = ?,ORDEN = ?,PORCENTAJE_PREG = ?,ID_FUNCION = ?,ID_SECTOR_PREGUNTA = ?,ID_PREGUNTA_SERVICIO = ?");
			sql.append(" WHERE ID_EXM_CONFIG = ?");

			this.jdbcTemplate.update(sql.toString(),exmConfig.getId_exm_perfil(),exmConfig.getId_nivel_gobierno(),exmConfig.getId_puesto_tipo(),exmConfig.getId_pregunta_tipo(),exmConfig.getOrden(),exmConfig.getPorcentaje_preg(),exmConfig.getId_funcion(),exmConfig.getId_sector_pregunta(),exmConfig.getId_pregunta_servicio(),exmConfig.getId_exm_config());
		}		
		return idExmConfig;
	}
	public void eliminarExmConfig(Number idExmConfig)
	{
		StringBuilder sql = new StringBuilder();
		
		//Eliminamos todos sus dependientes
		sql.append("DELETE FROM EXM_CONFIG ");
		sql.append(" WHERE ID_EXM_CONFIG = ?");			
		
		this.jdbcTemplate.update(sql.toString(),idExmConfig);			
	
	}
	public DemoParticipante getDemoParticipante(Number idDemoParticipante) {

		DemoParticipante obj = null;

		StringBuilder sql = new StringBuilder();
		sql.append("SELECT ID_DEMO_PARTICIPANTE,ID_PUESTO_TIPO,ID_SECTOR_PREGUNTA,ID_EXM_PERFIL,ID_NIVEL_GOBIERNO,ID_BANCO_PREGUNTA,ID_AMBITO");
		sql.append(" FROM DEMO_PARTICIPANTE WHERE ID_DEMO_PARTICIPANTE = ? ");

		List<Map<String, Object>> collec = jdbcTemplate.queryForList(sql.toString(),idDemoParticipante);
		for(Map<String, Object> rec : collec){
			obj = new DemoParticipante();
			obj.setId_demo_participante((Number)rec.get("ID_DEMO_PARTICIPANTE"));
			obj.setId_puesto_tipo((Number)rec.get("ID_PUESTO_TIPO"));
			obj.setId_sector_pregunta((Number)rec.get("ID_SECTOR_PREGUNTA"));
			obj.setId_exm_perfil((Number)rec.get("ID_EXM_PERFIL"));
			obj.setId_nivel_gobierno((Number)rec.get("ID_NIVEL_GOBIERNO"));
			obj.setId_banco_pregunta((Number)rec.get("ID_BANCO_PREGUNTA"));
			obj.setId_ambito((Number)rec.get("ID_AMBITO"));

		}
		return obj;

	}
	
	public Number grabarDemoParticipante(DemoParticipante demoParticipante,String listaFunciones)
	{
		StringBuilder sql = new StringBuilder();
		Number idDemoParticipante;
		DemoParticipante temp = this.getDemoParticipante(demoParticipante.getId_demo_participante());
		
		idDemoParticipante = demoParticipante.getId_demo_participante();
		
		if ( temp == null || temp.getId_demo_participante() == null)
		{			 

			sql = new StringBuilder();
			sql.append("INSERT INTO DEMO_PARTICIPANTE(ID_DEMO_PARTICIPANTE,ID_PUESTO_TIPO,ID_SECTOR_PREGUNTA,ID_EXM_PERFIL,ID_NIVEL_GOBIERNO,ID_BANCO_PREGUNTA,ID_AMBITO)");
			sql.append(" VALUES (?,?,?,?,?,?,?)");

			this.jdbcTemplate.update(sql.toString(),demoParticipante.getId_demo_participante(),demoParticipante.getId_puesto_tipo(),demoParticipante.getId_sector_pregunta(),demoParticipante.getId_exm_perfil(),demoParticipante.getId_nivel_gobierno(),demoParticipante.getId_banco_pregunta(),demoParticipante.getId_ambito());
		}
		else
		{
			sql = new StringBuilder();
			sql.append("UPDATE DEMO_PARTICIPANTE SET ID_PUESTO_TIPO = ?,ID_SECTOR_PREGUNTA = ?,ID_EXM_PERFIL = ?,ID_NIVEL_GOBIERNO = ?,ID_BANCO_PREGUNTA = ?,ID_AMBITO = ?");
			sql.append(" WHERE ID_DEMO_PARTICIPANTE = ?");

			this.jdbcTemplate.update(sql.toString(),demoParticipante.getId_puesto_tipo(),demoParticipante.getId_sector_pregunta(),demoParticipante.getId_exm_perfil(),demoParticipante.getId_nivel_gobierno(),demoParticipante.getId_banco_pregunta(),demoParticipante.getId_ambito(),demoParticipante.getId_demo_participante());
		}		
		//Grabamos la lista de funciones
		sql = new StringBuilder();
		sql.append("DELETE FROM DEMO_PARTICIPANTE_FUNCION ");
		sql.append(" WHERE ID_DEMO_PARTICIPANTE = ?");
		this.jdbcTemplate.update(sql.toString(),idDemoParticipante);
		
		sql = new StringBuilder();
		sql.append("INSERT INTO DEMO_PARTICIPANTE_FUNCION(ID_DEMO_PARTICIPANTE,ID_FUNCION) ");
		sql.append(" SELECT ?,ID_FUNCION FROM FUNCION WHERE ID_FUNCION in (").append(listaFunciones).append(")");
		this.jdbcTemplate.update(sql.toString(),idDemoParticipante);

		
		return idDemoParticipante;
	}
	public void generarTestDemo(Number idDemoParticipante)
	{
		StringBuilder sql = new StringBuilder();
		
		sql.append("CALL ALGORITMO.GENERAR_TEST(?,1,1)");				
		
		this.jdbcTemplate.update(sql.toString(),idDemoParticipante);
	}
	public List<PreguntaReporte> getPreguntasGeneradasDemo(Number idDemoParticipante)
	{
		List<PreguntaReporte> list = new LinkedList<PreguntaReporte>();

		StringBuilder sql = new StringBuilder();

		sql.append("SELECT pre.id_pregunta,pg.secuencia, pre.pregunta,fu.nemotecnico as funcion,pt.pregunta_tipo ,se.sector_pregunta");
		sql.append(" FROM demo_preguntas_generadas pg join pregunta pre on pg.id_pregunta = pre.id_pregunta");
		sql.append(" left join funcion fu on pre.id_funcion = fu.id_funcion");
		sql.append(" left join sector_pregunta se on pre.id_sector_pregunta = se.id_sector_pregunta");
		sql.append(" left join pregunta_tipo pt on pre.id_pregunta_tipo = pt.id_pregunta_tipo");
		sql.append(" WHERE pg.id_demo_participante = ? ");
		sql.append(" ORDER BY pg.secuencia");
		
		List<Map<String, Object>> collec = jdbcTemplate.queryForList(sql.toString(),idDemoParticipante);
		for(Map<String, Object> rec : collec){
			PreguntaReporte obj = new PreguntaReporte();
			
			obj.setId_pregunta((Number)rec.get("ID_PREGUNTA"));
			obj.setSecuencia((Number)rec.get("SECUENCIA"));
			obj.setPregunta((String)rec.get("PREGUNTA"));
			obj.setPregunta_tipo((String)rec.get("PREGUNTA_TIPO"));
			obj.setSector_pregunta((String)rec.get("SECTOR_PREGUNTA"));			
			obj.setFuncion((String)rec.get("FUNCION"));

			list.add(obj);
		}
		return list;		
	}

}
